package com.tedu.API;

import org.junit.Test;

import java.util.Locale;
import java.util.Scanner;

/**
 * javaSE：基础语法    JavaOOP面向对象编程    JavaAPI（帮助文件，理解：字典）
 *
 * JavaAPI【内置：Java编程好的】提供大量的类、接口、抽象类，异常，错误
 * 【预计提供好的库类：8000，JavaAPI只学重点】
 *
 * JavaAPI：字符串、包装类、集合【泛型】、线程、多线程【并发--->大数据】、
 *          IO流、Socket套接字【网络编程】
 *
 * jdk1.8.chm帮助文件    理解：新华字典     会查类、接口、抽象类·····使用
 * JDK版本-----帮助文档   根据用什么版本JDK，查对应版本的帮助文档
 *  必须会查API       String类-----位于什么包下   java.lang【默认，不需要导包】
 *
 *
 *
 * JDK1.8  StringAPI类库：构造器怎么用，方法怎么用？
 */
public class StringAPI {
    /**
     * JDK1.8  StringAPI类库：构造器怎么用，方法怎么用？
     * 包位于：java.lang  【不需要导包：System.String】
     * <p>
     * java: 错误: 无效的源发行版：17    junit----自动下载：testing级别【识别JDK17】
     * 调整Maven项目jdk版本，17版本降级到1.8版本
     * 找到pom.xml----17
     * <p>
     * 特点：不需要导包，不可被继承，字符数组,定义完毕无法修改但可以覆盖，String类时final字符串编码集
     * 顶级UniCode:GBK,UFT-8;任何一个字符对应2个字节！
     * <p>
     * <p>
     * 字符串底层：封装了字符串数组及针对字符串数组的操作算法
     * 字符数组==字符串
     * 定义：String str="直接量“；  给定值String字符串对象
     * String str=new String();  创建字符串对象
     */
    @Test
    public void testString() {
        String str = "字符串";
        System.out.println(str);
        char[] c = {'字', '符', '串'};//字符数组：静态的字符数组
        System.out.println(c);
        //字符串创建出来对象无法修改，因为String时final修饰
        String s = "hello world";
        s = "123";  //对象无法修改可以覆盖
        System.out.println(s);
    }

    /**
     * 定义给定值的方式：String src="java123";
     * Java为提高性能，针对静态字符串(字面量/常量/连接后结果)
     * 创建在String常量池中，对于重复创建静态字符串，JVM虚拟机首先会在常量池中查找，
     * 会在常量池中查找，如果找到就会返回对象，找不到就创建对象！
     * JVM会在虚拟机的堆内存中开辟一块空间，保存曾经使用过的字面量|常量
     * 一但后期又使用相同的字面量|常量，不会创建对象，直接使用对象
     * 好处：减少内存开销，提高性能
     */
    @Test
    public void testStrings() {
        String s1 = "java123"; //公共常量值
        String s2 = "java123";  //不会创建对象，从常量池java123
        System.out.println(s1 == s2);//true
        String s = "java"; //s对象，不可修改
        String s3 = s + "123"; //s3对象=s对象+”123“；  s3新对象
        System.out.println(s1 == s3);  //java123 ==java123   true
        String s4 = "java" + "123";//右侧：直接量方式拼接，存入常量池中
        System.out.println(s2 == s4);//ture
        //s2的java123从常量池中获取，s4拼接后静态字符串，从常量池中获取
        //------上面的代码：给定值定义字符串方式：拥有常量池-------------
        //------下面的代码：创建字符串对象方式：创建新对象---------------
        String s5 = new String("java123");
        //new出来的对象，一定是新对象，不存在常量池
        System.out.println(s4 == s5);

    }

    /**
     * String API 方法
     * length方法   返回值：int
     * 作用：返回当前字符串的长度（个数）----借鉴于数组length方法
     * 特点：字符串包含：特殊字符空格、字母、汉字
     * String对象采用Unicode顶级编码：每一个字符算1个，占2个字符
     */
    @Test
    public void testLength() {
        String str = "HelloWorld";//10
        System.out.println(str.length());
        str = " 我爱Java";
        System.out.println(str.length());//7
    }

    /**
     * indexOf方法----重载功能：修饰符   返回值     方法名  一致
     * 参数    不一致
     * indexOf(String index)    返回值：int
     * 第一个参数 int index:传入指定字符串
     * 作用：查找指定字符串在当前字符串中位置，首位置
     * 如果匹配到对应字符，输出首位置下标
     * 如果没有匹配到对应字符，返回-1值
     * indexOf(String index,int index)    返回值：int
     * 第一个参数 String str:传入指定字符串
     * 第二个参数int index：查找指定具体位置的下标
     * 作用：查找“具体下标值”的“字符串”在“当前字符串”中位置，首位置
     * 向下查找，不包含当前位置
     * 如果没有匹配到对应字符，返回-1值
     * lastInderOf(String str)方法
     * 作用：找匹配字符串中对应最后出现字符串位置
     */
    @Test
    public void testIndexOf() {
        String str = "thinking in java";//java编程思想【第四版】
        //返回值：下标位
        int index = str.indexOf("ja");//用处：查找相同的字符串
        System.out.println("打印下标位：" + index);
        index = str.indexOf(str = "in", 3);
        //用处：查找指定某一相同
        System.out.println("指定下标为" + index);
        //lastIndexOf()找到最后一个出现的下标位置
        index = str.lastIndexOf("in");
        System.out.println("最后下标位置" + index);
    }

    /**
     * StringAPI针对字符串提供三种方法：截取、替换、分割
     * subString()重载方法     截取    返回值：String
     * subString(int start,int end)     返回字符串
     * 作用：截取字符串,从下标start位置开始截取，截取到end下标位置
     * subString(int index)      返回字符串
     * 作用：截取字符串，从下标index位置开始截取，截取到最后
     * 通用口诀：含头不含尾
     */
    @Test
    public void testSubString() {
        String url = "www.baidu.com";//需求：通过截取字符串baidu
//        url=url.substring(3,9); //.baidu:3,9     .co:9,12
        System.out.println("截取字符串:" + url);
        //需求：通过截取字符串获取.com
        url = url.substring(9);
        System.out.println("截取字符串，截取到最后：" + url);
    }

    /**
     * charAt方法    返回值char
     * 作用：返回当前字符串中指定位置的字符
     * StringIndexOutOfBoundsException  异常
     * 字符串下标越界异常------出现原因：下标超出范围
     */
    @Test
    public void testCharAt() {
        String str = "thinking in java";
        char c = str.charAt(15);
        System.out.println("获取对应字符：" + c);
    }

    /**
     * trim方法   返回值String
     * 作用：去掉当前字符串前后空格
     * <p>
     * <p>
     * toLowerCase方法  返回值String
     * 作用：将字符串中所有的字符转换为小写
     * toUpperCase方法  返回值String
     * 作用：将字符串中所有的字符转换为大写
     * 验证码：xO4e    前台显示：xO4e    用户输入：xd4e
     */
    @Test
    public void testTrim() {
        String str = " xO4e";//后台出入前后都加空格.xO4e判断
        //后台传入前台字符串----一律空
        str = str.trim().toLowerCase();
        System.out.println("去掉空格：" + str);
    }

    /**
     * 正则表达式：语法--元字符   ^[0-9]*$
     * 验证字符串
     * matches方法
     * 作用：用于验证字符串，使用正则表达式进行验证【过滤字符】
     * 返回true正则验证成功，返回false正则验证失败
     */
    public static void main(String[] args) {
        String regex = "^[0-9]*$";
        System.out.println("请输入");
        //从控制台输入【模拟用户输入】    "123"
        Scanner input = new Scanner(System.in);
        //判断：如果正则通过，返回是数字，反之相反
        if (input.nextLine().matches(regex)) {
            System.out.println("是数字");
        } else {
            System.out.println("不是数字");
        }
    }

    /**
     * replace方法   替换    返回值：String
     * replace(String a,String b)
     * 第一个参数   String a 传入查找字符
     * 第二个参数   String b 传入替换字符
     * 作用：用于匹配字符串中存在的字符，匹配成功，替换成新字符,不支持正则
     * <p>
     * replace(String regex,String a)
     * 作用：用于全匹配字符串中存在字符，按照正则匹配成功，替换成新字符
     * 支持正则
     */
    @Test
    public void testReplace() {
        String str = "我爱Java";//需求：Java替换python
        str = str.replace("Java", "python");
        System.out.println("替换后的字符串：" + str);

        String regex = "^[\\u4e00-\\u9fa5]{0,}$";//验证汉字
        String say = "我去年买了块表";
        say = say.replaceAll(regex, "*****");//支持正则
        System.out.println("通过正则替换后的字符串：" + say);
    }

    /**
     * split方法   分割     返回值：String[]
     * 作用:用于按照“正则”或者“字符串”的方式分割字符串
     * www.baidu.com   按照.的方法获取
     * split写. 代表正则表达式：. 匹配一个字符
     * split写. 注意：转义成\\.
     */
    @Test
    public void testSplit() {
        String url = "www.baidu.com";//不知道下标情况，获取baidu
        String[] urls = url.split("\\.");
        System.out.println(urls[1]);//获取baidu
        //思考：代码哪里出现错误:ArrayIndexOutOfBoundsException
        //打印字符串数据------增强for  数组数据类型  引用：遍历数据引用
        for (String s:urls) {
            System.out.println("分割后的元素值："+s);
        }
    }
    /**
     * valueOf()   静态方法：通过类名访问问   返回值:String
     * 作用：基础字符类型转化为字符串
     */
    @Test
    public void testValueOf(){
        int i=123;//基础数据类型转化为字符串
        String s=String.valueOf(i);
        if(s.equals("123")){//s对象==“123”   判断对象false
                            //s对象.equals("123")  判断对象的值true  没有实际值判断对象
            System.out.println("是字符串");
        }else{
            System.out.println("不是字符串");
        }
    }
    //String API没有讲全-----会查API【电子政务】
}
